/**
 * @file example_usage.c
 * @brief STM32字体和图片资源管理器使用示例
 * @note 本文件展示了如何使用按需读取的资源管理器
 */

#include "lcd_src_manager.h"
#include "stdio.h"

/**
 * @brief 资源管理器使用示例
 * @note 展示如何初始化和使用按需读取的资源管理器
 */
void resource_manager_example(void)
{
    printf("=== STM32资源管理器使用示例 ===\r\n");
    
    // 1. 初始化资源管理器
    printf("1. 初始化资源管理器...\r\n");
    if (src_manager_read_head() != 0) {
        printf("错误：读取资源头部失败！\r\n");
        return;
    }
    
    if (src_manager_read_addr_table() != 0) {
        printf("错误：初始化地址表失败！\r\n");
        return;
    }
    printf("初始化完成！\r\n\r\n");
    
    // 2. 显示图片示例
    printf("2. 显示图片示例...\r\n");
    if (src_manager_show_image(100, 50, "logo_MQ")) {
        printf("图片显示成功！\r\n");
    } else {
        printf("图片显示失败！\r\n");
    }
    printf("\r\n");
    
    // 3. 显示单个字符示例
    printf("3. 显示单个字符示例...\r\n");
    if (src_manager_show_font_char(200, 100, "MQ2_CN_22", 0x4E2D)) { // "中"字
        printf("字符显示成功！\r\n");
    } else {
        printf("字符显示失败！\r\n");
    }
    printf("\r\n");
    
    // 4. 显示字符串示例
    printf("4. 显示字符串示例...\r\n");
    if (src_manager_show_String(50, 150, "Hello 世界", "MQ2_CN_22")) {
        printf("字符串显示成功！\r\n");
    } else {
        printf("字符串显示失败！\r\n");
    }
    printf("\r\n");
    
    // 5. 获取字符串宽度示例
    printf("5. 获取字符串宽度示例...\r\n");
    uint8_t en_width = src_manager_get_en_string_lenght("MQ2_CN_22", "Hello");
    uint8_t cn_width = src_manager_get_cn_char_lenght("MQ2_CN_22");
    printf("英文字符串宽度: %d 像素\r\n", en_width);
    printf("中文字符宽度: %d 像素\r\n", cn_width);
    printf("\r\n");
    
    printf("示例演示完成！\r\n");
}

/**
 * @brief 性能测试示例
 * @note 测试按需读取的性能表现
 */
void performance_test_example(void)
{
    printf("=== 性能测试示例 ===\r\n");
    
    // 测试多次访问同一资源的性能
    printf("测试多次访问同一资源...\r\n");
    
    const char* test_string = "测试字符串";
    const char* font_name = "MQ2_CN_22";
    
    // 第一次访问（需要查找和读取）
    uint32_t start_time = HAL_GetTick();
    src_manager_show_String(10, 10, test_string, font_name);
    uint32_t first_access = HAL_GetTick() - start_time;
    
    // 第二次访问（需要重新查找和读取）
    start_time = HAL_GetTick();
    src_manager_show_String(10, 30, test_string, font_name);
    uint32_t second_access = HAL_GetTick() - start_time;
    
    printf("第一次访问耗时: %lu ms\r\n", first_access);
    printf("第二次访问耗时: %lu ms\r\n", second_access);
    printf("注意：每次访问都需要重新查找，这是按需读取的代价\r\n");
    printf("\r\n");
}

/**
 * @brief 内存使用对比示例
 * @note 展示优化前后的内存使用差异
 */
void memory_usage_comparison(void)
{
    printf("=== 内存使用对比 ===\r\n");
    
    // 计算优化前的内存使用
    uint32_t old_memory = 100 * sizeof(struct src_addr_item_t); // 假设100个资源
    uint32_t new_memory = sizeof(struct src_addr_item_t);       // 现在只用一个
    
    printf("优化前内存使用: %lu 字节\r\n", old_memory);
    printf("优化后内存使用: %lu 字节\r\n", new_memory);
    printf("内存节省: %lu 字节 (%.1f%%)\r\n", 
           old_memory - new_memory, 
           (float)(old_memory - new_memory) / old_memory * 100);
    printf("\r\n");
    
    printf("优势说明:\r\n");
    printf("- 内存占用大幅减少\r\n");
    printf("- 支持更多资源文件\r\n");
    printf("- 启动速度更快\r\n");
    printf("- 适合资源受限的系统\r\n");
    printf("\r\n");
    
    printf("注意事项:\r\n");
    printf("- 每次访问需要Flash读取操作\r\n");
    printf("- 频繁访问同一资源时性能较低\r\n");
    printf("- 建议将常用资源放在地址表前面\r\n");
    printf("\r\n");
}

/**
 * @brief 错误处理示例
 * @note 展示如何正确处理各种错误情况
 */
void error_handling_example(void)
{
    printf("=== 错误处理示例 ===\r\n");
    
    // 测试查找不存在的资源
    printf("测试查找不存在的资源...\r\n");
    struct src_addr_item_t item;
    
    if (src_manager_find_and_read_by_name("不存在的图片", is_image, &item) != 0) {
        printf("正确：未找到不存在的图片资源\r\n");
    } else {
        printf("错误：不应该找到不存在的资源\r\n");
    }
    
    // 测试查找不存在的字体
    if (src_manager_find_and_read_by_name("不存在的字体", is_font, &item) != 0) {
        printf("正确：未找到不存在的字体资源\r\n");
    } else {
        printf("错误：不应该找到不存在的资源\r\n");
    }
    
    // 测试无效参数
    if (src_manager_find_and_read_by_name(NULL, is_image, &item) != 0) {
        printf("正确：NULL参数被正确拒绝\r\n");
    } else {
        printf("错误：NULL参数应该被拒绝\r\n");
    }
    
    printf("错误处理测试完成！\r\n\r\n");
}

/**
 * @brief 主示例函数
 * @note 调用所有示例函数
 */
void run_all_examples(void)
{
    printf("开始运行所有示例...\r\n\r\n");
    
    // 运行基本使用示例
    resource_manager_example();
    printf("----------------------------------------\r\n\r\n");
    
    // 运行性能测试示例
    performance_test_example();
    printf("----------------------------------------\r\n\r\n");
    
    // 运行内存使用对比
    memory_usage_comparison();
    printf("----------------------------------------\r\n\r\n");
    
    // 运行错误处理示例
    error_handling_example();
    printf("----------------------------------------\r\n\r\n");
    
    printf("所有示例运行完成！\r\n");
}

// 注意：这些函数需要在main函数中调用，并且需要确保：
// 1. W25Q Flash驱动已初始化
// 2. LCD显示驱动已初始化
// 3. 资源文件已正确烧录到Flash中 